package observer;

import lombok.Getter;
import lombok.Setter;

import java.util.HashMap;
import java.util.Map;

/**
 * 通过此类对象将消息传递出去。
 */
public class Transmitter {

    /**
     * 此消息传递者的传递动作
     */
    @Getter
    private String action;

    /**
     * 通过此对象，确定要将消息在指定区域传递。
     * 若此对象值为null，则表示此消息，在全局传递。
     */
    @Setter
    private String flag;

    /**
     * 消息保存着，此对象保存着，要传递的所有消息。
     */
    private Map<String, Object> saver;

    /**
     * 构造方法
     * @param action 此消息传递者，传递消息时，的动作
     */
    public Transmitter(String action) {
        this.action = action;
        saver = new HashMap<String, Object>();
    }

    /**
     * 通过此方法，将消息放保存起来。
     * @param key 保存此消息时，的绑定值
     * @param value 要传递的消息
     */
    public void put(String key, Object value) {
        this.saver.put(key, value);
    }

    /**
     * 通过此方法拿出此对象中传递的消息。
     * @param key 与要传递的消息的，绑定值
     * @param defaultValue 如果找不到与其绑定的key值，则返回此默认值
     * @param <T> 表示任何类型
     * @return 消息传递者，要传递的消息，或者defaultValue
     */
    public <T> T get(String key, T defaultValue) {
        T target = defaultValue;
        if (this.saver.containsKey(key)) {
            target = (T) this.saver.get(key);
        }
        return target;
    }

    /**
     * 调用此方法，将消息向指定区域传递。
     */
    public void send() {
        Manager.getInstance().notifyReceiver(flag, this);
    }
}
